package com.vy.stl.job;

import com.vy.stl.entity.Reserve;
import com.vy.stl.service.ReserveService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.List;

/**
 * @create: 2025/09/04 09:25
 * @description:
 * 类上标注了@Component，使其被 Spring 容器管理。
 * 方法changeReserveStatus()上标注了@Scheduled(cron = "0/10 * * * * *")，表示这是一个定时任务：
 * cron表达式"0/10 * * * * *"的含义是每 10 秒执行一次（从 0 秒开始，每隔 10 秒触发）。
 * 依赖于主类@EnableScheduling注解开启 Spring 的定时任务功能。
 */
@Component
public class ReserveStatusJob {

    @Autowired
    private ReserveService reserveService;

    @Scheduled(cron = "0/10 * * * * *")
    public void changeReserveStatus() throws Exception {
        //查询所有的预约信息
        List<Reserve> reserveList = reserveService.search(null);
        System.out.println("总预约数量：");
        for (Reserve reserve : reserveList) {
            // 新增：跳过“已取消”的预约，不再强制修改其状态
            if (reserve.getStatus() == 0) {
                continue;
            }
            // System.out.println(reserve);
            // 获取当前时间
            long nowTime = new Date().getTime();
            // 1. 如果上课时间 < 当前时间 && 下课时间（上课时间+时长） > 当前时间 ———— 上课中
            if (reserve.getCourse().getTime().getTime() < nowTime && (reserve.getCourse().getTime().getTime() + reserve.getCourse().getLength() * 60 * 1000) > nowTime) {
                // 修改预约状态，将预约状态改为上课中
                reserve.setStatus(2);
                reserveService.edit(reserve,true);
            }
            // 2. 下课时间（上课时间+时长） < 当前时间 ———— 已完课
            if (reserve.getCourse().getTime().getTime() + reserve.getCourse().getLength() * 60 * 1000 < nowTime) {
                //已完课
                reserve.setStatus(3);
                reserveService.edit(reserve,true);
            }
             //3. 如果上课时间 > 当前时间 ———— 已预约-未开课
            if (reserve.getCourse().getTime().getTime() > nowTime) {
                reserve.setStatus(1);
                reserveService.edit(reserve,true);
            }
        }
    }
}
